home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #1 / Amiga Plus CD - 1997 - No. 01.iso / pd / programmierung / proasm / routines / paraliner.r < prev    next >
Text File  |  1993-10-15  |  6KB  |  311 lines

  1.  
  2. ;---;  paraliner.r  ;----------------------------------------------------------
  3. *
  4. *    ****    UNIX like parameter line parser    ****
  5. *
  6. *    Author        Daniel Weber
  7. *    Version        1.06
  8. *    Last Revision    26.06.93
  9. *    Identifier    prl_defined
  10. *       Prefix        prl_    (parameter line)
  11. *                 ¯ ¯       ¯
  12. *    Functions    Paraliner    parameter line parser
  13. *
  14. *            prl_spacekiller simple space killer
  15. *            prl_nametaker    reads the file name to a dest. buffer
  16. *            prl_nametakerxx    line prl_nametaker but case independant
  17. *                    and accepting " " as possible end char
  18. *
  19. *
  20. *    Activation    prl_<char>:    EQU    <handler routine>
  21. *            prl_file    EQU    <file name reader routine>
  22. *            (NOTE: <char>: A..Z UPPER CASE!!!)
  23. *
  24. *            f.e:    prl_A    EQU    my_A_Handler
  25. *
  26. *    Notes        Note that these activation flags must be defined before
  27. *            you include this routine else the default handler
  28. *            will be used ('errline')!
  29. *
  30. *            The option handlers must exit using a RTS instruction
  31. *            and the registers A0/A4 must be kept unaffected
  32. *            (except A0 for the file name taker)!
  33. *
  34. *            You may use a5 as your 'external' base, since a4
  35. *            will not be affected.
  36. *
  37. *    Return values    Handler routines:    d0: +: OK for a non multi
  38. *                               parameter
  39. *                               (f.e.: -o <file> -d)
  40. *                            0: OK for a multi parameter
  41. *                               (f.e.: -bdc = -b -d -c)
  42. *                            -: FAILED
  43. *
  44. *            Name reader routines:    d0: 0+: OK    -:FAILED
  45. *
  46. ;------------------------------------------------------------------------------
  47.  
  48. ;------------------
  49.     ifnd    prl_defined
  50. prl_defined    SET    1
  51.  
  52. ;------------------
  53. prl_oldbase    equ __BASE
  54.     base    prl_base
  55. prl_base:
  56.  
  57. ;------------------
  58.     opt    sto,o+,q+,ow-        ;all optimisations on
  59.  
  60. ;------------------------------------------------------------------------------
  61. prl_option    MACRO            ;macro to create the parameter line
  62.         IFEQ    NARG
  63.         FAIL    paraliner.r: option missing
  64.         ELSE
  65.         IFD    prl_\1
  66.         dc.w    prl_\1%
  67.         ELSE
  68.         dc.w    .unknparameter%
  69.         ENDC
  70.         ENDC
  71.         ENDM
  72.  
  73.  
  74. ;------------------------------------------------------------------------------
  75. *
  76. * Paraliner        - UNIX like parameter line parser
  77. *
  78. * INPUT:    d0:    command line length    (prl_cmdlen)
  79. *        a0:    command line        (prl_cmdline)
  80. *
  81. * RESULT:    D0:         0: valid   -: Usage/invalid (see prl_invalid)
  82. *        prl_invalid:    0: ok       -: invalid
  83. *
  84. *         (Usage: D0<>0 and prl_inavlid=0)
  85. *
  86. ;------------------------------------------------------------------------------
  87.  
  88. Paraliner:
  89. ;------------------
  90.     movem.l    d1-d7/a1-a6,-(a7)
  91. ;    move.l    prl_cmdlen(pc),d0
  92. ;    move.l    prl_cmdline(pc),a0
  93.     lea    prl_base(pc),a4
  94.     clr.b    -1(a0,d0.l)        ;last char now zero
  95.     moveq    #2,d1
  96.     cmp.l    d1,d0
  97.     bcs    prl_usage
  98.  
  99.     clr.b    prl_invalid(a4)
  100.  
  101. ;----------------------------    
  102. .options:
  103.     tst.b    prl_invalid(a4)        ;error occured during parameter processing
  104.     bne    .errline
  105.     bsr    prl_spacekiller        ;higher word cleared in spacekiller
  106.     move.b    (a0)+,d0
  107.     beq    .goodline
  108. ;    move.b    d0,d1
  109. ;    lsl.w    #8,d1
  110. ;    move.b    (a0),d1
  111. ;    cmp.w    #"?"<<8,d1
  112. ;    beq    .usage
  113. ;    cmp.w    #"? ",d1
  114. ;    beq    .usage
  115.     cmp.b    #"-",d0
  116.     bne    .name
  117.     move.b    (a0)+,d0
  118.     beq    .errline
  119.  
  120. .takenext:
  121.     and.b    #$df,d0
  122.     sub.b    #"A",d0
  123.     cmp.b    #"Z"-"A",d0
  124.     bhi    .errline
  125.     add.w    d0,d0
  126.     move.w    .paras(pc,d0.w),d0
  127.     jsr    (a4,d0.w)
  128.     tst.l    d0
  129.     bmi    .errline
  130.     bne.s    .options
  131.  
  132. .nobinfile:                ;after allowed options only!!
  133.     moveq    #0,d0            ;for multiply options (-bd)
  134.     move.b    (a0)+,d0
  135.     beq    .goodline
  136.     cmp.b    #" ",d0
  137.     beq    .options
  138.     bra    .takenext
  139.  
  140.  
  141. ;-----------------------
  142. .paras:    prl_option    A
  143.     prl_option    B
  144.     prl_option    C
  145.     prl_option    D
  146.     prl_option    E
  147.     prl_option    F
  148.     prl_option    G
  149.     prl_option    H
  150.     prl_option    I
  151.     prl_option    J
  152.     prl_option    K
  153.     prl_option    L
  154.     prl_option    M
  155.     prl_option    N
  156.     prl_option    O
  157.     prl_option    P
  158.     prl_option    Q
  159.     prl_option    R
  160.     prl_option    S
  161.     prl_option    T
  162.     prl_option    U
  163.     prl_option    V
  164.     prl_option    W
  165.     prl_option    X
  166.     prl_option    Y
  167.     prl_option    Z
  168.  
  169.  
  170. ;-------------------------------------------------
  171. .name:                    ;get file name...
  172.     IFD    prl_file
  173.     subq.l    #1,a0
  174.     jsr    prl_file(pc)
  175.     tst.l    d0            ;return value...
  176.     bpl    .options
  177.     bra    .errline
  178.     ELSE
  179.     bra.s    .errline
  180.     ENDC
  181.  
  182. ;--------------------------------------
  183. .goodline:                ;correct line format
  184.     clr.b    prl_invalid(a4)
  185. .ouout    bsr    prl_spacekiller
  186.     moveq    #0,d0
  187.     movem.l    (a7)+,d1-d7/a1-a6
  188.     rts
  189.  
  190. ;--------------------------------------
  191. ;.usage:    st    prl_invalid(a4)
  192. ;        bra.s    .ouout
  193.  
  194. ;--------------------------------------
  195. .unknparameter:
  196.     addq.l    #4,a7            ;remove return address from stack
  197. .errline:                ;error found in parameter line...
  198.     st    prl_invalid(a4)
  199.     moveq    #-1,d0
  200.     movem.l    (a7)+,d1-d7/a1-a6
  201.     rts
  202.  
  203.  
  204.  
  205. ;------------------------------------------------
  206. * d2: case  0: case independant  -: case dependant
  207. * d3: poossible (accepted) end char (normally a SPC)
  208. * d7: max. length of name (max. 65535)
  209. * a0: source
  210. * a1: destination
  211. *
  212. prl_nametakerxx:
  213.     moveq    #0,d2            ;lower case
  214.     moveq    #" ",d3
  215. prl_nametaker:                ;d7: max number of chars to take
  216.     bsr    prl_spacekiller        ;d3: additional allowed endchar
  217.     moveq    #0,d0
  218.     moveq    #0,d5
  219.     move.l    d7,d6
  220.     subq.l    #1,d6
  221.     cmp.b    #$22,(a0)
  222.     beq.s    .strtname
  223.     cmp.b    #"'",(a0)
  224.     bne.s    .takesource
  225. .strtname:
  226.     move.b    (a0)+,d5
  227. .takesource:
  228.     move.b    (a0)+,d0
  229.     beq.s    .ender2
  230.     tst.b    d2
  231.     beq.s    .lower
  232.     cmp.b    #"a",d0            ;convert to upper case
  233.     blt.s    .lower
  234.     cmp.b    #"z",d0
  235.     bhi.s    .lower
  236.     and.b    #$df,d0
  237. .lower:    cmp.b    d0,d5
  238.     bne.s    .setin
  239.     cmp.b    (a0)+,d5
  240.     bne.s    .ender2
  241.  
  242. .setin:    cmp.b    #" ",d0
  243.     bne.s    .inloop
  244.     tst.b    d5
  245.     beq.s    .ender2
  246. .inloop:
  247.     move.b    d0,(a1)+
  248.     dbra    d7,.takesource
  249.     bra    .badline
  250.  
  251. .ender2:
  252.     sub.w    d7,d6
  253.     bmi    .badline
  254.     clr.b    (a1)            ;clr after last char
  255.     move.b    -(a0),d0
  256.     beq.s    .good
  257.     cmp.b    d3,d0            ;only useful for '.nametaker' entries
  258.     beq.s    .good
  259.     cmp.b    #" ",d0
  260.     bne    .badline
  261. .good:    moveq    #0,d0
  262.     rts
  263.  
  264. .badline:
  265.     moveq    #-1,d0
  266.     rts
  267.  
  268.  
  269. ;------------------------------------------------
  270. prl_spacekiller:
  271.     move.b    (a0)+,d0
  272.     cmp.b    #" ",d0
  273.     beq.s    prl_spacekiller
  274.     cmp.b    #$9,d0
  275.     beq.s    prl_spacekiller
  276.     subq.l    #1,a0
  277.     rts
  278.  
  279.  
  280. ;----------------------------------------------------------
  281. *
  282. * Usage routine...
  283. *
  284. prl_usage:
  285.     clr.b    prl_invalid(a4)
  286.     moveq    #-1,d0
  287.     movem.l    (a7)+,d1-d7/a1-a6
  288.     rts
  289.  
  290.  
  291. ;----------------------------------------------------------
  292. ;prl_cmdlen:    dc.l    0        ;command line length
  293. ;prl_cmdline:    dc.l    0        ;command line
  294. prl_invalid:    dc.b    0        ;0: ok   -: invalid parameter line
  295.         even
  296.  
  297.  
  298. ;--------------------------------------------------------------------
  299.  
  300. ;------------------
  301.     base    prl_oldbase
  302.  
  303. ;------------------
  304.     opt    rcl
  305.  
  306. ;------------------
  307.     endif
  308.  
  309.  end
  310.  
  311.